Rose-DB-Object
view release on metacpan or search on metacpan
lib/Rose/DB/Object/Manager.pm view on Meta::CPAN
if(ref $_[0] eq 'HASH')
{
return ($class, query => [ %{shift(@_)} ], @_);
}
elsif(ref $_[0] eq 'ARRAY')
{
return ($class, query => shift, @_);
}
else { Carp::croak 'Invalid arguments: ', join(', ', @_) }
}
return @_;
}
# XXX: These are duplicated from ManyToMany.pm because I don't want to use()
# XXX: that module from here if I don't have to. Lazy or foolish? Hm.
# XXX: Anyway, make sure they stay in sync!
use constant MAP_RECORD_METHOD => 'map_record';
use constant DEFAULT_REL_KEY => PRIVATE_PREFIX . '_default_rel_key';
sub object_class { }
sub default_manager_method_types
{
my($class) = shift;
if(@_)
{
if(@_ == 1 && ref $_[0] eq 'ARRAY')
{
$class->_default_manager_method_types(@_);
}
else
{
$class->_default_manager_method_types([ @_ ]);
}
}
return wantarray ?
@{$class->_default_manager_method_types} : $class->_default_manager_method_types;
}
sub make_manager_methods
{
my($class) = shift;
if(@_ == 1)
{
@_ = (methods => { $_[0] => [ $class->default_manager_method_types ] });
}
else
{
Carp::croak "make_manager_methods() called with an odd number of arguments"
unless(@_ % 2 == 0);
}
my %args = @_;
local $Debug = $args{'debug'} if(exists $args{'debug'});
my $calling_class = ($class eq __PACKAGE__) ? (caller)[0] : $class;
my $target_class = $args{'target_class'} || $calling_class;
my $object_class = $args{'object_class'};
my $class_invocant = UNIVERSAL::isa($target_class, __PACKAGE__) ?
$target_class : __PACKAGE__;
unless($object_class)
{
if(UNIVERSAL::isa($target_class, 'Rose::DB::Object::Manager'))
{
$object_class = $target_class->object_class;
}
if(!$object_class && UNIVERSAL::isa($target_class, 'Rose::DB::Object'))
{
$object_class = $target_class;
}
}
unless($object_class)
{
Carp::croak "Could not determine object class. Please pass a value for ",
"the object_class parameter",
(UNIVERSAL::isa($target_class, 'Rose::DB::Object::Manager') ?
" or override the object_class() method in $target_class" : '');
}
unless(UNIVERSAL::isa($object_class, 'Rose::DB::Object'))
{
my $error;
TRY:
{
local $@;
eval "require $object_class";
$error = $@;
}
if($error)
{
Carp::croak "Could not load object class $object_class - $error";
}
}
my $meta = $object_class->meta;
my $cm = $meta->convention_manager;
my $base_name = $args{'base_name'} || $cm->auto_manager_base_name($meta->table, $object_class);
if(!$args{'methods'})
{
unless($base_name)
{
Carp::croak "Missing methods parameter and base_name parameter, and the ",
"convention manager's auto_manager_base_name() method did not ",
"return a true value"
}
$args{'methods'} =
{
$base_name => [ $class->default_manager_method_types ]
( run in 0.957 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )