<?php 
namespace eMacros\Runtime\Environment; 
 
use eMacros\Applicable; 
use eMacros\Scope; 
use eMacros\GenericList; 
use eMacros\Symbol; 
use eMacros\Environment\Environment; 
use eMacros\Package\Package; 
 
class EnvironmentImport implements Applicable { 
    /** 
     * Imports a package into current environment 
     * Usage: (import eMacros\Package\MathPackage) (import eMacros\Package\PasswordPackage Pwd)  
     * Returns: NULL 
     * (non-PHPdoc) 
     * @see \eMacros\Applicable::apply() 
     */ 
    public function apply(Scope $scope, GenericList $arguments) { 
        if (!($scope instanceof Environment)) { 
            throw new \RuntimeException("EnvironmentImport: Cannot import package from outside of main context."); 
        } 
         
        $nargs = count($arguments); 
         
        if ($nargs == 0) { 
            throw new \BadFunctionCallException('EnvironmentImport: No package specified.'); 
        } 
         
        if (!($arguments[0] instanceof Symbol)) { 
            throw new \InvalidArgumentException(sprintf("EnvironmentImport: Expected symbol as first argument but %s was found instead.", substr(strtolower(strstr(get_class($arguments[0]), '\\')), 1))); 
        } 
         
        $package = $arguments[0]->symbol; 
         
        if (!class_exists($package, true)) { 
            //try finding a compatible package in eMacros\\Package namespace 
            $xpackage = sprintf("eMacros\\Package\\%sPackage", $package); 
             
            if (class_exists($xpackage, true)) { 
                $package = $xpackage; 
            } 
            else { 
                throw new \InvalidArgumentException("EnvironmentImport: Package '$package' not found."); 
            } 
        } 
 
        $rc = new \ReflectionClass($package); 
         
        if ($rc->isSubclassOf('eMacros\Package\Package')) { 
            if ($nargs > 1) { 
                if (!($arguments[1] instanceof Symbol)) { 
                    throw new \InvalidArgumentException(sprintf("EnvironmentImport: Expected symbol as second argument but %s was found instead.", substr(strtolower(strstr(get_class($arguments[1]), '\\')), 1))); 
                } 
                 
                $alias = $arguments[1]->symbol; 
                 
                //validate alias 
                if (!preg_match(Symbol::PACKAGE_PREFIX, $alias . '::')) { 
                    throw new \InvalidArgumentException("EnvironmentImport: Alias '$alias' is not a valid package alias."); 
                } 
                 
                return $scope->import($rc->newInstance(), $alias); 
            } 
             
            return $scope->import($rc->newInstance()); 
        } 
         
        throw new \InvalidArgumentException("EnvironmentImport: '$package' is not a valid package class."); 
    } 
} 
 
?>
 
 |