Merge pull request #21 from jgennis/rbase

Adding a builtinPool type
diff --git a/live_tracker.go b/live_tracker.go
index 4157f95..3b41d06 100644
--- a/live_tracker.go
+++ b/live_tracker.go
@@ -113,6 +113,10 @@
 	_, ok := l.pools[p]
 	if !ok {
 		def, err := p.def(l.config)
+		if err == errPoolIsBuiltin {
+			// No need to do anything for built-in rules.
+			return nil
+		}
 		if err != nil {
 			return err
 		}
diff --git a/package_ctx.go b/package_ctx.go
index e142ce8..f160eb4 100644
--- a/package_ctx.go
+++ b/package_ctx.go
@@ -98,7 +98,12 @@
 	name_: "phony",
 }
 
+var Console Pool = &builtinPool{
+	name_: "console",
+}
+
 var errRuleIsBuiltin = errors.New("the rule is a built-in")
+var errPoolIsBuiltin = errors.New("the pool is a built-in")
 var errVariableIsArg = errors.New("argument variables have no value")
 
 // checkCalledFromInit panics if a Go package's init function is not on the
@@ -557,6 +562,30 @@
 	return p.pctx.pkgPath + "." + p.name_
 }
 
+type builtinPool struct {
+	name_  string
+}
+
+func (p *builtinPool) packageContext() *PackageContext {
+	return nil
+}
+
+func (p *builtinPool) name() string {
+	return p.name_
+}
+
+func (p *builtinPool) fullName(pkgNames map[*PackageContext]string) string {
+	return p.name_
+}
+
+func (p *builtinPool) def(config interface{}) (*poolDef, error) {
+	return nil, errPoolIsBuiltin
+}
+
+func (p *builtinPool) String() string {
+	return "<builtin>:" + p.name_
+}
+
 type staticRule struct {
 	pctx       *PackageContext
 	name_      string
diff --git a/scope.go b/scope.go
index 91a758a..ef4eb2c 100644
--- a/scope.go
+++ b/scope.go
@@ -170,6 +170,11 @@
 }
 
 func (s *basicScope) IsPoolVisible(pool Pool) bool {
+	_, isBuiltin := pool.(*builtinPool)
+	if isBuiltin {
+		return true
+	}
+
 	name := pool.name()
 
 	for s != nil {