package Promise::Lazy; use parent 'Promises::Promise'; sub new { my( $class, $usercallback ) = @_; my $self = $class::SUPER->new(); $self->{ usercallback } = $usercallback; $self }; sub result { my( $self ) = @_; my $result = $self->{ usercallback }->(); if( $result ) { $self->resolve( $result ) } else { $self->reject(); }; }; ... somewhere in your code ... return Promise::Lazy->new(sub { External::Parser->run('--in', $file); });