package PJVM::ClassLoader; use strict; use warnings; use File::Spec; use File::Slurp qw(slurp); use IO::Scalar; use PJVM::Class; our @ISA = qw(Exporter); use Object::Tiny qw( classpath ); sub new { my ($pkg, $args) = @_; $args = {} unless ref $args eq "HASH"; my $classpath; if ($args->{classpath}) { die "argument 'classpath' must be an array reference" unless ref $args->{classpath} eq "ARRAY"; $classpath = $args->{classpath}; } my $self = bless { classpath => $classpath, }, $pkg; return $self; } sub load_class { my ($self, $fqcn) = @_; # Find the class to load my $path; for my $cp (@{$self->classpath}) { my $pt = File::Spec->catfile($cp, "${fqcn}.class"); if (-e $pt) { $path = $pt; last; } } die "Can't find '${fqcn}.class' in my classpath" unless $path; open(my $io, "<:raw", $path) || die $!; my $class = $self->read_class($io); close($io); return $class; } sub read_class { my ($self, $io) = @_; return PJVM::Class->new_from_io($io); } 1; __END__ =head1 NAME PJVM::ClassLoader - =head1 SYNOPSIS =head1 DESCRIPTION =head1 INTERFACE