Scripting
view release on metacpan or search on metacpan
Scripting/Expose.pm view on Meta::CPAN
# $Source: /Users/clajac/cvsroot//Scripting/Scripting/Expose.pm,v $
# $Author: clajac $
# $Date: 2003/07/21 10:10:05 $
# $Revision: 1.10 $
package Scripting::Expose;
use Attribute::Handlers;
use Scripting::Expose::Class;
use Scripting::Expose::Function;
use strict;
my %Classes;
my %Functions;
my %Variables;
my %Packages;
sub is_valid_symbol {
my $sym = shift;
return $sym =~ /^[A-Za-z][A-Za-z0-9_]*$/ ? 1 : 0;
}
sub import {
shift;
die "Odd number of arguments in use\n" if(@_ & 1);
my %args = (@_);
my $pkg = (caller)[0];
# Class name
my $name = $pkg;
$name = $args{as} if(exists $args{as});
die "Undefined class name in '$pkg'\n" unless(defined $name);
die "Empty class name in '$pkg'\n" if($name eq '');
die "Unsupported class name '$name' in '$pkg'\n" unless(is_valid_symbol($name));
# For categories
my $to;
if (exists $args{to}) {
$to = $args{to};
die "To must be a scalar or an ARRAY reference in '$pkg'\n" unless(ref $to eq '' || ref eq 'ARRAY');
$to = [$to] unless(ref $to);
for (@$to) {
die "Invalid to '$_' in '$pkg'\n" unless(is_valid_symbol($_));
}
} else {
$to = [qw(_Global)];
}
$Packages{$pkg} = {} unless(ref $Packages{$pkg} eq 'HASH');
$Packages{$pkg}->{$_} = 1 for(@$to);
if ($name) {
my $class = Scripting::Expose::Class->new($name, $pkg);
if (exists $Classes{$class->package} && $class->package ne $pkg) {
die "Class '@{[$class->class]}' already in package '@{[$class->package]}'\n";
}
$Classes{$class->package} = $class;
unless (exists $Functions{$pkg}) {
my $func_table = Scripting::Expose::Function->new();
$Functions{$pkg} = $func_table;
}
}
1;
}
sub _process {
my ($pkg, $symbol, $ref, $handler, $options, $phase) = @_;
die "Can't expose anonymous subrutines\n" if($symbol eq 'ANON');
die "Invalid symbol '$symbol'\n" unless(ref $symbol eq 'GLOB');
my ($name) = *$symbol =~ /^.*::(.*)$/;
my $orig_name = $name;
my $secure = 0;
if ($options) {
die "Odd number of arguments to '$handler' in '$pkg'\n" if(ref $options ne 'ARRAY' || @$options & 1);
my %args = (@$options);
if (exists $args{as} && ($name = $args{as})) {
die "Undefined name for '$orig_name' in '$pkg'\n" unless(defined $name);
die "Empty name for '$orig_name' in '$pkg'\n" if($name eq '');
( run in 1.136 second using v1.01-cache-2.11-cpan-97f6503c9c8 )