Use Proc.call to ensure caller self is preserved