Class-PObject
view release on metacpan or search on metacpan
package Class::PObject;
# PObject.pm,v 1.57 2005/02/20 18:05:00 sherzodr Exp
use strict;
#use diagnostics;
use Log::Agent;
use vars ('$VERSION', '$revision');
$VERSION = '2.17';
$revision = '1.57';
# configuring Log::Agent
logconfig(-level=>$ENV{POBJECT_DEBUG} || 0);
sub import {
my $class = shift;
my $caller_pkg = (caller)[0];
unless ( @_ ) {
no strict 'refs';
*{ "$caller_pkg\::pobject" } = \&{ "$class\::pobject" };
return 1
}
require Exporter;
return $class->Exporter::import( @_ )
}
sub pobject {
my ($class, $props);
# are we given explicit class name to be created in?
if ( @_ == 2 ) {
($class, $props) = @_;
logtrc 1, "pobject %s => %s", $class, $props
}
# Is class name assumed to be the current caller's package?
elsif ( $_[0] && (ref($_[0]) eq 'HASH') ) {
$props = $_[0];
$class = (caller())[0];
logtrc 1, "pobject ('%s'), %s", $class, $props
}
# otherwise, we throw a usage exception:
else {
logcroak "Usage error"
}
# should we make sure that current package is not 'main'?
if ( $class eq 'main' ) {
logcroak "'main' cannot be the class name"
}
# creating the class virtually. Note, that it is different
# then the way Class::Struct works. Class::Struct literally builds
# the class contents in a string, and then eval()s them.
# And we play with symtables. However, I'm not sure how secure this method is.
no strict 'refs';
# if the properties have already been created, it means the user
# is declaring the class with the same name twice. He should be shot!
if ( ${ "$class\::props" } ) {
logcroak "are you trying to create the same class two times?"
}
# we should have some columns
unless ( @{$props->{columns}} ) {
logcroak "class '%s' should have columns!", $class
}
# one of the columns should be 'id'. I believe this is a limitation,
# which should be eliminated in next release
my $has_id = 0;
for ( @{$props->{columns}} ) {
$has_id = ($_ eq 'id') and last
}
unless ( $has_id ) {
logcroak "one of the columns must be 'id'"
}
( run in 0.551 second using v1.01-cache-2.11-cpan-6de40a662fe )