require 'ruby/reflection/support/shift_reset'
require 'continuation' unless defined? callcc

module Ruby
  class Reflection
    class ThreadMirror < ObjectMirror
      include AbstractReflection::ThreadMirror
      include ShiftReset
      reflect! Thread
      Frame = Struct.new :method, :index, :file, :line, :thread

      def status
        s = @subject.status
        if s.respond_to? :to_str
          s.to_str
        elsif s.nil?
          "aborted"
        else
          "dead"
        end
      end

      def run
        @subject.run
      end

      def stack
        if bt = @subject.backtrace
          bt.each_with_index.collect do |str, idx|
            file, line, method_spec = str.split(':')
            method_spec =~ /\`([^']+)'/
            method = $1
            frame = Frame.new method, idx, file, line, self
            reflection.reflect frame
          end
        else
          []
        end
      end

      def return_value
        return nil if @subject.alive?
        @subject.value
      end
    end
  end
end